package Herramientas;

import CalendarioDAOS.CalendarioDAO;
import TPVTarryDTOS.ItemListaDTO;
import TPVTarryDTOS.TicketDTO;
import TarryDAOS.ClientesDAO;
import TarryDAOS.TarryItemsPedidoDAO;
import TarryDAOS.TarryProductosDAO;
import TarryDTOS.ClientesDTO;
import TarryDTOS.TarryItemPedidoDTO;
import TarryDTOS.TarryPedidosDTO;
import com.esponce.webservice.QRCodeClient;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Vector;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;

/**
 *
 * @author Mauricio Alan
 */
public class FileEngine {

    /**
     * alan gonzalez prueba de excel
     */
    public void crearExcel() {
        // CREANDO EL LIBRO
        HSSFWorkbook libro = new HSSFWorkbook();
        // CREANDO HOJA DENTRO DEL LIBRO
        HSSFSheet hoja = libro.createSheet("REPORTE EN HOJA 1");
        // CREANDO UNA FILA DENTRO DE LA HOJA
        HSSFRow fila = hoja.createRow(0);
        // CREANDO UNA CELDA DENTRO DE LA FILA
        HSSFCell celda = fila.createCell(0);
        // ESTILO DE LA CELDA     
        CellStyle style = libro.createCellStyle();
        // CREANDO CONTENIDO DENTRO DE LA CELDA 
        HSSFRichTextString texto = new HSSFRichTextString("hola mundo");
        celda.setCellValue(texto);
        // SE GUARDA EN LOCAL
        try {
            FileOutputStream elFichero = new FileOutputStream("C:/ERPOffice/test.xls");
            libro.write(elFichero);
            elFichero.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * ALAN GONZALEZ CREA UN PDF GENIAL
     */
    public void crearPDF() {
        Rectangle pageSize = new Rectangle(222f, 600f); // equivalente a 80mm de ancho 
        Document pdf = new Document(pageSize);
        try {
            PdfWriter.getInstance(pdf, new FileOutputStream("C:/ERPOffice/pdf545.pdf"));
            pdf.open();
            Image logo = Image.getInstance("C:/imgsReport/logo.jpg");
            logo.setAbsolutePosition(65, 500);
            logo.scaleAbsolute(80f, 60f);
            pdf.add(logo);
            //Paragraph par = new Paragraph();
            //par.add("IT WORKS!");
            //pdf.add(par);
            pdf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String qr(String qrValue) throws Exception {

        Herramientas herramientas = new Herramientas();
        // GENERAR UNA CADENA DE CARACTERES ALEATORIOA PARA NOMBRA AL RECURSO
        String nombreArchivo = herramientas.cadenaAlfanumericaAleatoria(3);
        // GUARDANDO EN SERVICIO FTP LOCAL DEL SERVIDOR
        String path = "C:/FTP_SERVER/QR-" + nombreArchivo + ".png";
        // URL PUBLICA DEL QUICK RESPONSE
        String urlQRGenerado = "ftp://192.168.56.1/QR-" + nombreArchivo + ".png";

        //WEB SERVICE
        QRCodeClient client = new QRCodeClient();
        BufferedInputStream ins = client.generate(qrValue);

        //GUARDANDO EL QUICK RESPONSE
        FileOutputStream fos = new FileOutputStream(path);
        BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
        int length = 0;
        byte[] data = new byte[1024];
        while ((length = ins.read(data, 0, 1024)) > 0) {
            bos.write(data, 0, length);
        }
        bos.close();
        fos.close();
        ins.close();
        return urlQRGenerado;
    }

    /**
     * ALAN GONZALEZ METODO QUE CREA UN TICKET DE VENTA EN PDF
     */
    public void ticketVenta(TicketDTO ticket) {
        int idTicket = ticket.getIdTicket();
        Vector listaItemsVenta = ticket.getItems();

        Rectangle pageSize = new Rectangle(222f, 600f); // equivalente a 80mm de ancho y alto
        Document pdf = new Document(pageSize);
        String ruta = "C:/ERPOffice/pdf2545.pdf";
        try {
            PdfWriter.getInstance(pdf, new FileOutputStream(ruta.toString()));
            pdf.open();
            Image logo = Image.getInstance("C:/imgsReport/logo.jpg");
            //logo.setAbsolutePosition(65, 500);
            logo.setAlignment(Element.ALIGN_CENTER);
            logo.scaleAbsolute(80f, 60f);
            pdf.add(logo);
// FUENTE  
            Font fuente = new Font();
            fuente.setSize(8);
            fuente.setStyle(1);
            fuente.setFamily(BaseFont.COURIER);
// CABECERA DEL TICKET //
// RENGLON 1
            Paragraph par = new Paragraph();
            par.setAlignment(Element.ALIGN_CENTER);
            par.setFont(fuente);
            par.add("IRMA LETICIA");
            pdf.add(par);
// RENGLON 2
            Paragraph par2 = new Paragraph();
            par2.setAlignment(Element.ALIGN_CENTER);
            par2.setFont(fuente);
            par2.add("BUSTAMANTE SAMPERIO");
            pdf.add(par2);
// RENGLON 3
            Paragraph par3 = new Paragraph();
            par3.setAlignment(Element.ALIGN_CENTER);
            par3.setFont(fuente);
            par3.add("BENITO JUAREZ #12 SANTA MARTHA ACATITLA C.P. 098977");
            pdf.add(par3);
// MARQUECINA
            Paragraph marquecina = new Paragraph();
            marquecina.setFont(fuente);
            marquecina.setAlignment(Element.ALIGN_CENTER);
            marquecina.add("****** CONCEPTOS ******");
            pdf.add(marquecina);
// ITEMS DE COMPRA
            int aux = 0;
            for (aux = 0; aux < listaItemsVenta.size(); aux++) {
                ItemListaDTO item = (ItemListaDTO) listaItemsVenta.elementAt(aux);
                Paragraph parrafoItem = new Paragraph();
                parrafoItem.setAlignment(Element.ALIGN_CENTER);
                parrafoItem.setFont(fuente);
                parrafoItem.add(item.getIdItem() + " " + item.getDescripcion().toString() + " " + item.getCantidad() + " " + item.getPrecioPublico() + " " + item.getSubTotal() + "         ");
                pdf.add(parrafoItem);
            }
// TOTAL DE VENTA
            Paragraph totalVenta = new Paragraph();
            totalVenta.setFont(fuente);
            totalVenta.setAlignment(Element.ALIGN_RIGHT);
            totalVenta.add("Total: " + "$" + ticket.getTotalventa() + "");
            pdf.add(totalVenta);

// MANERA DE PAGO 1.- EFECTIVO 2.- TARJETA
            Paragraph tipoPago = new Paragraph();
            tipoPago.setFont(fuente);
            tipoPago.setAlignment(Element.ALIGN_RIGHT);
            String tipoPagoTicket = new String();
            if (ticket.getTipoPago() == 1) {
                tipoPagoTicket = "EFECTIVO";
            }
            if (ticket.getTipoPago() == 2) {
                tipoPagoTicket = "TARJETA";
            }
            if (ticket.getTipoPago() == 3) {
                tipoPagoTicket = "OTROS";
            }
            tipoPago.add("Tipo Pago :" + tipoPagoTicket.toString());
            pdf.add(tipoPago);
// MONTO RECIBIDO
            Paragraph montoRecibido = new Paragraph();
            montoRecibido.setFont(fuente);
            montoRecibido.setAlignment(Element.ALIGN_RIGHT);
            montoRecibido.add("Recibido: $" + ticket.getMontoRecibido());
            pdf.add(montoRecibido);
// CAMBIO POR DEVOLVER
            Paragraph cambioVuelta = new Paragraph();
            cambioVuelta.setFont(fuente);
            cambioVuelta.setAlignment(Element.ALIGN_RIGHT);
            cambioVuelta.add("Su Cambio: $" + ticket.getCambioDevolver());
            pdf.add(cambioVuelta);
// FECHA Y HORA
            CalendarioDAO calendario = new CalendarioDAO();
            String fecha = calendario.getFechaActual();
            String hora = calendario.getHoraActual();
            Paragraph fechaHora = new Paragraph();
            fechaHora.setFont(fuente);
            fechaHora.setAlignment(Element.ALIGN_CENTER);
            fechaHora.add(fecha + " " + hora);
            pdf.add(fechaHora);
// MENSAJE SALIDA 
            Paragraph mensajeFin = new Paragraph();
            mensajeFin.setFont(fuente);
            mensajeFin.setAlignment(Element.ALIGN_CENTER);
            mensajeFin.add("**** GRACIAS POR SU COMPRA ****");
            pdf.add(mensajeFin);
// IMPRESION DE TICKET
            /*
             Thread.sleep(3000);
             ServicioImpresion sp = new ServicioImpresion();
             sp.imprimir(ruta);
             */
            pdf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String packingListOrder(int idPedido) {

// RUTA TOTAL ENCABEZA EL METODO        
        String ruta = "C:/packingListOrders/packing_list_oreder_" + idPedido + ".pdf";

// SE OBTIENE EL PEDIDO [ SOLO DETALLES ]
        TarryItemsPedidoDAO pedidoDAO = new TarryItemsPedidoDAO();
        TarryPedidosDTO pedidoDTO = new TarryPedidosDTO();
        TarryProductosDAO productosDAO = new TarryProductosDAO();
        pedidoDTO = pedidoDAO.unPedidoPorId(idPedido);
        CalendarioDAO calendario = new CalendarioDAO();
// SE OBTIENE EL CLIENTE 
        ClientesDAO clienteDAO = new ClientesDAO();
        ClientesDTO clienteDTO = new ClientesDTO();
        clienteDTO = clienteDAO.clientesDTO(pedidoDTO.getIdCliente());

// SE OBTIENEN LOS CONCEPTOS DEL PEDIDO [ ARTICULOS ]
        TarryItemsPedidoDAO itemsDAO = new TarryItemsPedidoDAO();
        Vector vProductosPedidos = new Vector();
        vProductosPedidos = itemsDAO.itemsPorPedido(idPedido);
        Document pdf = new Document();

        try {
            PdfWriter.getInstance(pdf, new FileOutputStream(ruta.toString()));
            pdf.open();
            Image logo = Image.getInstance("C:/erpDocsResources/logo.png");
            logo.setAlignment(Element.ALIGN_CENTER);
            logo.scaleAbsolute(80f, 60f);
            pdf.add(logo);
// FUENTE  
            Font fuente = new Font();
            fuente.setSize(11);
            fuente.setStyle(1);
            fuente.setFamily(BaseFont.SYMBOL);
            fuente.setColor(BaseColor.WHITE);

            Font fuente2 = new Font();
            fuente2.setSize(11);
            fuente2.setStyle(1);
            fuente2.setFamily(BaseFont.COURIER);
            fuente2.setColor(BaseColor.BLACK);
// SEPARADOR 0
            Paragraph sep0 = new Paragraph();
            sep0.setAlignment(Element.ALIGN_CENTER);
            sep0.setFont(fuente);
            sep0.add("IRMA LETICIA");
            pdf.add(sep0);

// ======================================================================
// ENCABEZADO DETALLES
            Paragraph fecha = new Paragraph();
            fecha.setAlignment(Element.ALIGN_RIGHT);
            fecha.setFont(fuente2);
            fecha.add("FECHA: "+calendario.getFechaActual() + "   HORA: " +calendario.getHoraActual()); // DATOS TOMADOS DEL SERVIDOR 
            pdf.add(fecha);

// ENCABEZADO
            Paragraph marquecina = new Paragraph();
            marquecina.setFont(fuente2);
            marquecina.setAlignment(Element.ALIGN_CENTER);
            marquecina.add(" LISTA DE CONCEPTOS A SURTIR ");
            pdf.add(marquecina);

// LINEA DE SEPARACION 1
            Paragraph sep1 = new Paragraph();
            sep1.setAlignment(Element.ALIGN_CENTER);
            sep1.setFont(fuente);
            sep1.add("sep1");
            pdf.add(sep1);

// ENCABEZADO DETALLES
            Paragraph titulo1 = new Paragraph();
            titulo1.setAlignment(Element.ALIGN_LEFT);
            titulo1.setFont(fuente2);
            titulo1.add("DETALLES DEL PEDIDO: ");
            pdf.add(titulo1);

// LINEA DE SEPARACION 2
            Paragraph sep2 = new Paragraph();
            sep2.setAlignment(Element.ALIGN_CENTER);
            sep2.setFont(fuente);
            sep2.add("sep2");
            pdf.add(sep2);

// LINEA DE ID DEL PEDIDO ID CLIENTE
            Paragraph idPedidoLinea = new Paragraph();
            idPedidoLinea.setAlignment(Element.ALIGN_LEFT);
            idPedidoLinea.setFont(fuente2);
            idPedidoLinea.add("ID Pedido: " + pedidoDTO.getId() + "    ID Cliente:  " + clienteDTO.getId());
            pdf.add(idPedidoLinea);

// LINEA RAZON SOCIAL CLIENTE 
            Paragraph nombreRazonSocial = new Paragraph();
            nombreRazonSocial.setAlignment(Element.ALIGN_LEFT);
            nombreRazonSocial.setFont(fuente2);
            nombreRazonSocial.add("Nombre Cliente / RazonSocial: " + clienteDTO.getNombreCliente());
            pdf.add(nombreRazonSocial);

// LINEA RAZON SOCIAL DIRECCION
            Paragraph direccion = new Paragraph();
            direccion.setAlignment(Element.ALIGN_LEFT);
            direccion.setFont(fuente2);
            direccion.add("Direccion: " + clienteDTO.getDomicilio());
            pdf.add(direccion);

// LINEA RAZON SOCIAL CIUDAD / ESTADO
            Paragraph ciudadEstado = new Paragraph();
            ciudadEstado.setAlignment(Element.ALIGN_LEFT);
            ciudadEstado.setFont(fuente2);
            ciudadEstado.add("Ciudad: " + clienteDTO.getCiudad() + "  Estado: " + clienteDTO.getEstado());
            pdf.add(ciudadEstado);

// LINEA RAZON SOCIAL CIUDAD / ESTADO
            Paragraph telefono = new Paragraph();
            telefono.setAlignment(Element.ALIGN_LEFT);
            telefono.setFont(fuente2);
            telefono.add("Telefono: " + clienteDTO.getTelefono());
            pdf.add(telefono);

// LINEA RAZON SOCIAL CIUDAD / ESTADO
            Paragraph sep3 = new Paragraph();
            sep3.setAlignment(Element.ALIGN_LEFT);
            sep3.setFont(fuente);
            sep3.add("Telefono: " + clienteDTO.getTelefono());
            pdf.add(sep3);

            // CONCEPTOS / PARTIDAS DEL PEDIDO
            vProductosPedidos = vProductosPedidos;

            // ENCABEZADO DE LA TABLA
            PdfPTable table = new PdfPTable(3);

            // addCell() agrega una celda a la tabla, el cambio de fila
            // ocurre automaticamente al llenar la fila
            table.addCell("ID PRODUCTO");
            table.addCell("DESCRICPION");
            table.addCell("N° CAJAS SOLICITADAS");
            int contAux = 0;
            for (contAux = 0; contAux < vProductosPedidos.size(); contAux++) {
                // DESEMPAQUETANDO EL OBJETO
                TarryItemPedidoDTO pedido = (TarryItemPedidoDTO) vProductosPedidos.elementAt(contAux);
                // CREANDO LINEA DINAMICA 
                table.addCell(Integer.toString(pedido.getIdProducto()));
                table.addCell(productosDAO.descripcionProducto(pedido.getIdProducto()));
                table.addCell(Integer.toString( pedido.getCantidadCorrugados()) );
            }
            pdf.add(table);

            pdf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return ruta;
    }
}
